[AWS IoT Core] 新規に機能追加された、共有サブスクリプション(MQTTv5) を試してみました
1 はじめに
CX 事業本部のデリバリー部の平内(SIN)です。
昨年末、IoT Coreでサポート開始となったMQTTv5ですが、当初、共有サブスクリプションについては、未サポートとなっていました。
そして、昨日、これが、サポートされたとのアナウンスがありました。
Posted On: Apr 13, 2023
AWS IoT Core announces general availability for MQTT5 Shared Subscriptions and new CloudWatch metrics
MQTTv5の共有サブスクリプションは、MQTTv3から追加された機能の中でも、結構インパクトのあるものだと思うのですが、IoT Coreでは、メッセージブローカーに到着したデータを処理する場合、サブスクライブしなくても「ルール」で効率よく取り込めますし、後段にKinesis Data Streamsなどを挟むことで、簡単にスケールできたので、元々、サポートされていたとも言えると思います。
そういう意味では、IoT Coreでは、活躍できる場面は少ないかな?とも思ってしまいますが、ここは、IoT Coreを純粋なメッセージブローカーとして、サブスクライブしてデータを処理する場面をイメージして、話を進めたいと思います。
2 共有サブスクリプション
共有サブスクリプションは、Publishされたメッセージを複数のクライアントで分散して処理できる機能であり、ロードバランサーのように機能します。
共有サブスクリプションで使用されるトピック名は、以下のような形式です。
$share/{ShareName}/{TopicFilter}
/ で区切られた、最初の $share は、共有サブスクリプションであることを示すフィルタであり、固定の文字列です。
2番目は、グループ名で、ここが同じとなっている複数クライアントが、メッセージを共有します。
3番目以降は、通常のトピック名と同じように機能します。
例えば、sensor/001というトピック名でPublishされたメッセージは、以下のような構文でサブスクライブできます
1. sensor/001 2. sensor/# 3. $share/group1/sensor/001 4. $share/group1/sensor/# 5. $share/group2/sensor/001 6. $share/group2/sensor/#
1、2は、通常通りの使用方法であり、サブスクライブしている全てのクライアントに送信されますが、3,4及び、5,6は、グループ化された共有サブスクリプションであり、グループに複数のクライアントが存在する場合、グループ内のどれか1つのクライアントに順次送信されることになります。
$share/group1/sensor/# を3つのクライアントがサブスクライブしていた場合、 sensor/001にPublishされたメッセージは、3つのクライアントに順番に送信され、結果的に各クライアントの負荷は、1/3となります。
トピックに大量のPublishがあって、複数のSubscriberで分散処理したい場合、簡単に移行ができると思います。
3 動作
ioT Coreの共有サブスクライブは、以下のように機能します。
- グループ内のサブスクライバーが切断されると、グループ内の残りのサブスクライバーに送信する
- QoS=0の場合、Publishの再試行は行われない
- QoS=1の場合、Publishが失敗した場合、別のサブスクライバーに送信され、すべての再試行に失敗した時破棄される
- 永続セッションを使用する QoS=1 Publishが失敗した場合、キューに入れられず、グループ内の別のサブスクライバーに対して試行される
- 共有サブスクリプションはRetainedメッセージを受信しない
MQTT 5 supported features/Shared Subscriptions
以下、ちょっと、試してみた様子です。
4 最後に
今回は、新しく機能追加された、共有サブスクリプションについて、その動作を確認してみました。
最初に書いたとおり、ロードバランサーとしてのメリットは、IoT Coreでは感じにくいですが、この仕組みは、もしかすると面白い使い方ができるかもしれません。 共有サブスクリプションは、Publish側には、特に変更がないので、既存のシステムの改善で使用することも可能でしょう。
なお、IoT Coreでは、この機能は、MQTTv5とMQTT3.1の両方で機能するそうです。
5 参考リンク
MQTT 5 supported features/Shared Subscriptions
AWS IoT Core endpoints and quotas
Testing Shared Subscriptions in the MQTT client